package com.orzxlee.Lambda06;

/**
 * Lambda 表达式和匿名内部类的区别
 *
 * 所需类型不同
 *      匿名内部类:接口,抽象类,具体类
 *      Lambda表达式: 接口
 *
 * 使用限制不同
 *      接口中一个方法,可以使用Lambda表达式,匿名内部类
 *      接口中大于一个方法,只能使用匿名内部类
 * 实现原理不同
 *      匿名内部类:编译后,产生一个单独的带$.class字节码文件
 *      Lambda表达式:编译后,不产生带$.class字节码文件.对应的字节码会在运行的时候动态生成
 *
 *
 */
public class LambdaDemo {
    public static void main(String[] args) {

        //匿名内部类
//        useInter(new Inter() {
//            @Override
//            public void show() {
//                System.out.println("Inter 接口");
//            }
//        });
//
//        useAnimal(new Animal() {
//            @Override
//            public void method() {
//                System.out.println("Animal 抽象类");
//            }
//        });
//
//        useStudent(new Student(){
//            @Override
//            public void study() {
//                System.out.println("Student 具体类");
//            }
//        });


        //Lambda表达式调用
        useInter(() -> System.out.println("Inter 接口"));

        //当Inter接口中存在两个抽象方法 匿名内部类的调用情况
//        useInter(new Inter() {
//            @Override
//            public void show() {
//                System.out.println("Inter show()");
//            }
//
//
//        });



    }

    private static void useStudent(Student s){
        s.study();
    }
    private static void useAnimal(Animal a){
        a.method();
    }
    private static void useInter(Inter i){
        i.show();
        //i.show2();
    }



}
